package com.zb.activemq.have_a_try;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ScheduledMessage;

/**
 * @Title 消息生产者
 * @Description 消息生产者是由会话创建的一个对象，用于把消息发送到一个目的地
 * Created by dongyuncong on 2017/6/23.
 */
public class Producer {
    private static final int SEND_NUMBER = 10;

    public static void main(String[] args) {
        // ActiveMQConnectionFactory连接工厂 客户用来创建连接的对象
        ConnectionFactory connectionFactory;
        // JMS Connection 封装了客户与 JMS 提供者之间的一个虚拟的连接。
        Connection connection = null;
        // JMS Session 是生产和消费消息的一个单线程上下文。会话用于创建消息生产者（producer）、消息消费者（consumer）和消息（message）等。
        // 会话提供了一个事务性的上下文，在这个上下文中，一组发送和接收被组合到了一个原子操作中。
        Session session;
        // 目的地是客户用来指定它生产的消息的目标和它消费的消息的来源的对象。
        Destination destination;
        // 【消息生产者】
        MessageProducer producer;
        // 构造ConnectionFactory实例对象，此处采用ActiveMq的实现jar
        connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD,
                "tcp://172.22.23.169:61616");
        try {
            connection = connectionFactory.createConnection();
            connection.start();
            // 获取操作连接,Session.AUTO_ACKNOWLEDGE。当客户成功的从 receive 方法返回的时候，
            // 或者从 MessageListener.onMessage 方法成功返回的时候，会话自动确认客户收到的消息。
            session = connection.createSession(Boolean.TRUE, Session.CLIENT_ACKNOWLEDGE);

            // 获取session注意参数值FirstQueue是一个服务器的queue，须在在ActiveMq的console配置
            destination = session.createQueue("FirstQueue");
            producer = session.createProducer(destination);
            // NON_PERSISTENT。不要求 JMS provider 持久保存消息。
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            sendMessage(session, producer);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != connection)
                    connection.close();
            } catch (Throwable ignore) {
            }
        }
    }

    public static void sendMessage(Session session, MessageProducer producer) throws Exception {
        for (int i = 1; i <= SEND_NUMBER; i++) {
            TextMessage message = session.createTextMessage("ActiveMq 生产者的消息" + i);
            long time = 60 * 1000;
            message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, time);
            System.out.println("ActiveMq [生产者]消息:" + i);
            producer.send(message);
        }
    }
}
